package com.threeti.mecool.core.util;

import java.io.InputStream;
import java.util.Properties;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.threeti.mecool.common.resource.Content;
import com.threeti.mecool.common.resource.ContentRepo;
import com.threeti.mecool.common.resource.ContentRepoFactory;

/** TODO 
 * jay:transparent Remote
 * jay:exception handling
 */
public abstract class ContentRepoUtil {	
	private static Logger logger = LoggerFactory.getLogger(ContentRepoUtil.class);
	private static String REPO_ROOT = "/";
	private static String REPO_PROTOCOL = Content.URL_PROTOCOL_FILE;
	
	static {
		try {
			Properties prop = new Properties();
			prop.load(ContentRepoUtil.class.getClassLoader().getResourceAsStream("content_repo.properties"));
			REPO_PROTOCOL = prop.getProperty("content.repo.protocol");
			REPO_ROOT = prop.getProperty("content.repo.root");
		} catch (Exception e) {
			logger.error("装载 内容仓库配置文件 失败", e);
		}
	}

	/**
	 * 向仓库中保存数据
	 * @param contentRelativePath
	 * @param data
	 */
	public static void putContentToRepo(String contentRelativePath, byte[] data) {
		Validate.notEmpty(contentRelativePath, "内容资源的路径不能为空");
		Validate.isTrue(contentRelativePath.startsWith("/"), "上传内容时，其路径必须是相对路径，必须以'/'开头");		
		ContentRepo repo = ContentRepoFactory.beginLocal();
		try {
			repo.put(contentEntry() + contentRelativePath, data);
		} catch (Exception e) {
			logger.error("向 内容仓库 上传内容失败", e);
		}
	}

	/**
	 * 向仓库中保存数据
	 * @param contentRelativePath
	 * @param data
	 */
	public static void putContentToRepo(String contentRelativePath, InputStream data) {
		try {
			putContentToRepo(contentRelativePath, IOUtils.toByteArray(data));
		} catch (Exception e) {
			logger.error("向 内容仓库 上传内容 失败", e);
		}
	}
	
	/**
	 * 由仓库中返回数据
	 * @param contentRelativePath
	 * @return
	 */
	public static Content getContentFromRepo(String contentRelativePath) {
		Validate.notEmpty(contentRelativePath, "内容资源的路径不能为空");
		Validate.isTrue(contentRelativePath.startsWith("/"), "获取内容时，其路径必须是相对路径，必须以'/'开头");
		ContentRepo repo = ContentRepoFactory.beginLocal();
		try {
			return repo.get(contentEntry() + contentRelativePath);
		} catch (Exception e) {
			logger.error("从 内容仓库 获取内容 失败", e);
		}
		return null;
	}
	
	/**
	 * 由仓库中删除数据
	 * @param contentRelativePath
	 */
	public static void deleteContentFromRepoQuietly(String contentRelativePath) {
		if (StringUtils.isNotBlank(contentRelativePath)) {
			if(!contentRelativePath.startsWith("/")){
				logger.warn(String.format("删除内容时，其路径 '%s' 必须是相对路径，必须以'/'开头", contentRelativePath));
			}
			ContentRepo repo = ContentRepoFactory.beginLocal();
			try {
				repo.delete(contentEntry() + contentRelativePath);
			} catch (Exception e) {
				logger.warn("从 内容仓库删除内容 失败", e);
			}
		}
	}
	
	/**
	 * 判断所给路径是否为图片资源
	 * @param contentRelativePath
	 * @return
	 */
	public static boolean isContentImage(String contentRelativePath) {
		Validate.notEmpty(contentRelativePath, "内容资源的路径不能为空");
		if (contentRelativePath.endsWith(".jpg") || contentRelativePath.endsWith(".jpeg") || contentRelativePath.endsWith(".JPG") || contentRelativePath.endsWith(".JPEG")) {
			return true;
		} else if (contentRelativePath.endsWith(".png") || contentRelativePath.endsWith(".PNG")) {
			return true;
		} else if (contentRelativePath.endsWith(".gif") || contentRelativePath.endsWith(".GIF")) {
			return true;
		} else if (contentRelativePath.endsWith(".bmp") || contentRelativePath.endsWith(".BMP")) {
			return true;
		} else if (contentRelativePath.endsWith(".svg") || contentRelativePath.endsWith(".svgz") || contentRelativePath.endsWith(".SVG") || contentRelativePath.endsWith(".SVGZ")) {
			return true;
		} else if (contentRelativePath.endsWith(".tif") || contentRelativePath.endsWith(".tiff") || contentRelativePath.endsWith(".TIF") || contentRelativePath.endsWith(".TIFF")) {
			return true;
		}
		
		return false;
	}

	/**
	 * 判断所给路径是否为文本资源
	 * @param contentRelativePath
	 * @return
	 */
	public static boolean isContentPlainText(String contentRelativePath) {
		Validate.notEmpty(contentRelativePath, "内容资源的路径不能为空");
		if (contentRelativePath.endsWith(".txt") || contentRelativePath.endsWith(".TXT")) {
			return true;
		} else if (contentRelativePath.endsWith(".html") || contentRelativePath.endsWith(".HTML")) {
			return true;
		}
		
		return false;
	}
	
	private static String contentEntry() {
		return REPO_PROTOCOL + ":" + REPO_ROOT;
	}

}
